package org.example.buffer;

import io.netty.buffer.ByteBuf;

import java.nio.ByteBuffer;

import static io.netty.buffer.Unpooled.*;

public class BufferDemo {

    public static void main(String[] args) {
        //普通的buff是固定大小的堆buff
        ByteBuf heapBuffer    = buffer(128);
        //directBuffer是固定大小的direct buff。direct buff使用的是堆外内存，省去了数据到内核的拷贝，因此效率比普通的buff要高
        ByteBuf directBuffer  = directBuffer(256);
        //wrappedBuffer是对现有的byte arrays或者byte buffers的封装，可以看做是一个视图，当底层的数据发生变化的时候，Wrapped buffer中的数据也会发生变化。
        ByteBuf wrappedBuffer = wrappedBuffer(new byte[128], new byte[256]);
        //Copied buffer是对现有的byte arrays、byte buffers 或者 string的深拷贝，所以它和wrappedBuffer是不同的，Copied buffer和原数据之间并不共享数据。
        ByteBuf copiedBuffer  = copiedBuffer(ByteBuffer.allocate(128));

        //随机访问buff
        //随机访问
        ByteBuf buffer = heapBuffer;
        for (int i = 0; i < buffer.capacity(); i ++) {
            byte b = buffer.getByte(i);
            System.out.println((char) b);
        }


        //遍历readable bytes
        while (directBuffer.isReadable()) {
            System.out.println(directBuffer.readByte());
        }

    }
}
